/*
 * controlRobot16.cpp
 *
 *  Created on: Dec 1, 2013
 *      Author: m
 */

#include "DefinicionesComunes.h"
#include "CPrinter.h"
#include <ctime>
#include "ICinta15.h"
#include "IRobot14.h"
#include "IRobot16.h"
#include "ControladorR16Consumidor.h"
#include "DSMManager.h"

using ipc::CPrinter;

int main ( int argc, char* argv[] )
{
    DSMManager::inicializar("robot16");

    ControladorR16Consumidor  controlador;

    ICinta15 *cinta15;
    IRobot14 *robot14;
    IRobot16 *robot16;

    cinta15 = &controlador;
    robot14 = &controlador;
    robot16 = &controlador;

    bool tieneElems;

    int sleepTime;

    ElementoProduccion elemento;

    srand( getpid() );

    CPrinter::setHeader("R16");

    while ( true )
    {
        CPrinter::printOut( "Verifico si la cinta15 tiene elementos" );
        tieneElems = cinta15->tieneElementos();

        if ( !tieneElems )
        {
            CPrinter::printOut( "Esperando Elementos en la cinta 15" );

            robot16->esperarNuevoElemento();
        }

        /*
         * Si el elemento no está en el extremo de este robot, avanzo la cinta
         *  para poder retirarlo, asimismo al avanzar la cinta notifico que
         *  hay espacio vacio al inicio para que el productor se despierte si
         *  es que estaba esperando lugar.
         */
        while ( cinta15->avanzar() )
        {
            sleepTime = SLEEP_AVANZAR_CINTA;
            CPrinter::printOut( "Avanzando la cinta 15 durante: %ds",
                    sleepTime );
            sleep( sleepTime );

            if ( robot14->esperaEspacioVacio() )
            {
                CPrinter::printOut( "Despertando al Robot 14");

                robot14->notificarEspacioVacio();
            }
        }

        /*
         * Finalmente quito el elemento de la cinta, si la primer posicion esta
         *  ocupada avanzo la cinta una vez y finalmente notifico al productor
         *  que hay un nuevo espacio libre en la cinta
         */
        elemento = cinta15->quitar();

        sleepTime = SLEEP_QUITAR_ELEMENTO;
        CPrinter::printOut( "Quitando elemento de cinta 15 durante: %ds",
                sleepTime );
        sleep( sleepTime );

        CPrinter::printOut( "Obtenido el elemento: %d de la cinta 15",
                elemento.productoId );

        if ( robot14->esperaEspacioVacio() )
        {
            cinta15->avanzar();


            sleepTime = SLEEP_AVANZAR_CINTA;
            CPrinter::printOut( "Avanzando la cinta 15 durante: %ds",
                    sleepTime );
            sleep( sleepTime );

            CPrinter::printOut( "Despertando al Robot 14");

        }

        robot14->notificarQuiteElemento();
    }

    return 0;
}
